import axios from 'axios'
import { tansParams } from '@/utils/ruoyi'
import cache from '@/plugins/cache'
import { ElMessage, ElLoading } from 'element-plus'
import { blobValidate } from '@/utils/ruoyi'
import { saveAs } from 'file-saver'

// 后端为 Django，接口直接使用 HTTP 状态码，无需 token 与业务 code
// 可选：根据需要保留重复提交防护
let downloadLoadingInstance

const femService = axios.create({
  baseURL: import.meta.env.VITE_APP_FEM_API,
  timeout: 300000
})

femService.interceptors.request.use(config => {
  // GET 参数拼接（与原实现一致）
  if (config.method === 'get' && config.params) {
    let url = config.url + '?' + tansParams(config.params)
    url = url.slice(0, -1)
    config.params = {}
    config.url = url
  }
  // 简易重复提交防护（可选）
  const isRepeatSubmitDisabled = (config.headers || {}).repeatSubmit === false
  if (!isRepeatSubmitDisabled && (config.method === 'post' || config.method === 'put')) {
    const requestObj = {
      url: config.url,
      data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
      time: Date.now()
    }
    const requestSize = Object.keys(JSON.stringify(requestObj)).length
    const limitSize = 5 * 1024 * 1024
    if (requestSize < limitSize) {
      const sessionObj = cache.session.getJSON('femSessionObj')
      if (!sessionObj) {
        cache.session.setJSON('femSessionObj', requestObj)
      } else {
        const interval = 1000
        if (sessionObj.data === requestObj.data && requestObj.url === requestObj.url && requestObj.time - sessionObj.time < interval) {
          return Promise.reject(new Error('数据正在处理，请勿重复提交'))
        } else {
          cache.session.setJSON('femSessionObj', requestObj)
        }
      }
    }
  }
  return config
}, error => Promise.reject(error))

femService.interceptors.response.use(res => {
  // 二进制直接返回
  if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
    return res.data
  }
  // Django 返回：直接使用 HTTP 状态码判定
  const status = res.status
  if (status >= 200 && status < 300) {
    // 201 创建成功、204 无内容等按需处理
    if (status === 201) {
      // 可选提示：ElMessage.success('创建成功')
    }
    return res.data
  }
  ElMessage.error('请求失败，状态码: ' + status)
  return Promise.reject(new Error('HTTP ' + status))
}, error => {
  // 统一错误提示
  if (error && error.response) {
    const status = error.response.status
    switch (status) {
      case 400: ElMessage.error('请求参数错误 (400)'); break
      case 401: ElMessage.error('未授权 (401)'); break // 理论上不会出现，因无鉴权
      case 403: ElMessage.error('禁止访问 (403)'); break
      case 404: ElMessage.error('资源不存在 (404)'); break
      case 500: ElMessage.error('服务器错误 (500)'); break
      default: ElMessage.error('请求失败，状态码: ' + status)
    }
    return Promise.reject(error)
  }
  let msg = error.message || '网络异常'
  if (msg === 'Network Error') msg = '网络连接异常'
  else if (msg.includes('timeout')) msg = '请求超时'
  ElMessage.error(msg)
  return Promise.reject(error)
})

export function femDownload(url, params, filename, config) {
  downloadLoadingInstance = ElLoading.service({ text: '正在下载 FEM 数据，请稍候', background: 'rgba(0,0,0,0.7)' })
  return femService.post(url, params, {
    transformRequest: [(params) => { return tansParams(params) }],
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    responseType: 'blob',
    ...config
  }).then(async (data) => {
    const isBlob = blobValidate(data)
    if (isBlob) {
      const blob = new Blob([data])
      saveAs(blob, filename)
    } else {
      // 若后端异常返回文本而非 blob
      const resText = await data.text()
      ElMessage.error('文件下载失败: ' + resText.slice(0, 120))
    }
    downloadLoadingInstance.close()
  }).catch(e => {
    console.error(e)
    ElMessage.error('FEM 文件下载失败')
    downloadLoadingInstance.close()
  })
}

export default femService
